/**
 * @author 作者 :
 * @version 
 * @Date 创建时间：2020-11-16 16:27:27
 * @Description 类说明 : TODO 
 */
package com.bawei.dongyoufa_common.utils;

import java.net.URL;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * @author Carre
 *
 */
public class StringUtil {
	
	// 邮箱正则
	private static final String EMAIL_REGEX = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
	// 手机正则
	private static final String PHONE_REGEX = "^1[3|4|5|7|8]\\d{9}$";
	// 字母正则
	private static final String LETTER_REGEX = "[a-zA-Z]+";


	
	/**
	 * 
	 * @Title: isPhone
	 * @Description 方法的作用 : 2、验证是否为合格手机号码
	 * @param 参数 :@param 
	 * @param 参数 :@return
	 * @return 返回类型 :boolean
	 * @throws
	 */
	public static boolean isPhone(String src) {
		
		// 判断字符是否有值
		if (!hasText(src))
			return false;
		return src.matches(PHONE_REGEX);
	}
	
	/**
	 * 
	 * @Title: isEmail
	 * @Description 方法的作用 :  验证是否为合格邮箱 
	 * @param 参数 :@param email
	 * @param 参数 :@return
	 * @return 返回类型 :boolean
	 * @throws
	 */
	public static boolean isEmail(String email) {
		// 判断字符是否有值
		if (!hasText(email))
			return false;
		return email.matches(EMAIL_REGEX);
	}
	
	
	/**
	 * 
	 * @Title: isLetter
	 * @Description 方法的作用 : 判断是否全部为字母
	 * @param 参数 :@param src
	 * @param 参数 :@return
	 * @return 返回类型 :boolean
	 * @throws
	 */
	public static boolean isLetter(String src) {
		// 判断字符是否有值
		if (!hasText(src))
			return false;
		return src.trim().matches(LETTER_REGEX);
	}

	
	
	/**
	 * 
	 * @Title: getPlaceholderValue
	 * @Description 方法的作用 : 根据正则在字符串提取一段值，用于后面在url地址里提取ID值
	 * @param 参数 :@param src
	 * @param 参数 :@param regex
	 * @param 参数 :@return
	 * @return 返回类型 :String
	 * @throws
	 */
	//例如在“http://news.cnstock.com/news,yw-201908-4413224.htm”把“4413224”提取出来。
	public static boolean getPlaceholderValue(String src, String regex){
		
		  //编译规则
		  Pattern p = Pattern.compile(regex);
		  //Pattern 匹配src
		  Matcher matcher = p.matcher(src);
		  //如果找到
		  if(matcher.find()) {
			//返回匹配到的字符串
			return  true;
		  }
		return false;
	}
	
	/**
	 * 
	 * @Title: hidden
	 * @Description 方法的作用 : 隐藏字符串 如：("13856237928", 3,7) -> "138****7928"
	 * @param 参数 :@param src
	 * @param 参数 :@param start
	 * @param 参数 :@param end
	 * @param 参数 :@return
	 * @return 返回类型 :String
	 * @throws
	 */
	public static String hiddenStr(String src, Integer start, Integer end) {
		// 非空判断
		if (!StringUtil.hasText(src))
			return "源字符串不能为空";
		//0 检查输入开始和结束位置是否合适
		if (start > end)
		return "输入的参数不合适";
		// 1.根据开始和结束位置截取要隐藏的内容
		String hiddenStr = src.substring(start, end);
		// 2.生成要替换成的*
		String replaceStr = "";
		for (int i = 0; i < hiddenStr.length(); i++) {
			replaceStr += "*";
		}
		// 3. 执行替换
		return src.replaceFirst(hiddenStr, replaceStr);

	}

	/**
	 * 
	 * @Title: reverse
	 * @Description 方法的作用 : 反转字符串
	 * @param 参数 :@param src
	 * @param 参数 :@return
	 * @return 返回类型 :String
	 * @throws
	 */
	public static String reverse(String src) {
		// 判断字符是否有值
		if (!hasText(src))
			return "字符串不能为空";
		return new StringBuffer(src).reverse().toString();
	}

	/**
	 * 
	 * @Title: hasText
	 * @Description 方法的作用 : 非空校验（检查不包含空白字符在内的字符系列长度，并处理过滤前后空格）
	 * @param 参数 :@param src
	 * @param 参数 :@return
	 * @return 返回类型 :boolean
	 * @throws
	 */
	public static boolean hasText(String src) {

		return src != null && src.trim().length() > 0;

	}

	/**
	 * 
	 * @Title: hasLength
	 * @Description 方法的作用 :检查包含空白字符在内的字符系列长度
	 * @param 参数 :@param src
	 * @param 参数 :@return
	 * @return 返回类型 :boolean
	 * @throws
	 */
	public static boolean hasLength(String src) {

		return src != null && src.length() > 0;
	}

	
	/**
	 * 
	 * @Title: isHttpUrl
	 * @Description 方法的作用 : 判断传入字符串是否为http路径 （判断传入的字符串是否为包含http的url地址）
	 * @param 参数 :@param src
	 * @param 参数 :@return
	 * @return 返回类型 :boolean
	 * @throws
	 */
	public static boolean isHttpUrl(String src){
		// 通过异常分析判断是否路径正确
		try {
			URL url = new URL(src);
			url.openStream();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		//System.out.println("不是合法的url");
		return false;
	
	}
}
